package Persistencia;

import Classes.Contacto;
import Classes.Empresa;
import Classes.Persona;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

/**
 *
 * @author Juampi
 */
public class ContactMapper {

    private static ContactMapper instance;

    private ContactMapper() {
    }

    public static ContactMapper getInstance() {
        if (instance == null) {
            instance = new ContactMapper();
        }
        return instance;
    }

    public ArrayList<Contacto> getAllContacts() {
        ArrayList<Contacto> contactList = new ArrayList<Contacto>();
        Contacto contacto;
        try {
            java.sql.ResultSet rs = DBManager.getInstance().getSELECT("select * from contactos");

            while (rs.next()) {
                if (rs.getString("tipo").equals("P")) {
                    Persona persona = new Persona();
                    persona.setNombre(rs.getString("nombre_razon"));
                    persona.setCelular(rs.getInt("telefono_movil"));
                    contacto = persona;
                } else {
                    Empresa empresa = new Empresa();
                    empresa.setRazonSocial(rs.getString("nombre_razon"));
                    empresa.setRubros(rs.getString("rubros"));
                    empresa.setUrlWeb(rs.getString("web"));
                    contacto = empresa;
                }
                contacto.setCiudad(CiudadesMapper.getInstance().getCiudad(rs.getInt("cp")));
                contacto.setCorreoElectronico(rs.getString("email"));
                contacto.setDireccion(rs.getString("direccion"));
                contacto.setId(rs.getInt("id"));
                contacto.setTelefono(rs.getInt("telefono"));
                contactList.add(contacto);
            }
            rs.close();
        } catch (Exception e) {
        }
        return contactList;
    }

    public boolean insertContact(Contacto contacto) {
        String razonSocial;
        int movil;
        char tipo;
        String web = "null";
        String rubros = "null";
        java.sql.Date fecha;

        try {
            if (contacto.getTipo() == Contacto.ES_EMPRESA) {
                tipo = 'E';
                Empresa empresa = (Empresa) contacto;
                razonSocial = empresa.getRazonSocial();
                movil = 0;
                fecha = new java.sql.Date(Calendar.getInstance().getTime().getTime());
                web = empresa.getUrlWeb();
                rubros = empresa.getRubros();
            } else {
                tipo = 'P';
                Persona persona = (Persona) contacto;
                razonSocial = persona.getNombre();
                movil = persona.getCelular();
                fecha = new java.sql.Date(persona.getFechaNacimiento().getTime().getTime());
            }

            java.sql.PreparedStatement pstmt = DBManager.getInstance().getNuevaConexion().prepareStatement(
                    "INSERT INTO contactos (tipo,nombre_razon,direccion,cp,telefono,email,telefono_movil,fecha_nacimiento,web,rubros) "
                    + "values (?,?,?,?,?,?,?,?,?,?)", com.mysql.jdbc.Statement.RETURN_GENERATED_KEYS);

            pstmt.setString(1, String.valueOf(tipo));
            pstmt.setString(2, razonSocial);
            pstmt.setString(3, contacto.getDireccion());
            pstmt.setString(4, String.valueOf(contacto.getCiudad().getCodigoPostal()));
            pstmt.setString(5, String.valueOf(contacto.getTelefono()));
            pstmt.setString(6, contacto.getCorreoElectronico());
            pstmt.setString(7, String.valueOf(movil));
            pstmt.setString(8, new SimpleDateFormat("yyyy-MM-dd").format(fecha));
            pstmt.setString(9, web);
            pstmt.setString(10, rubros);
            pstmt.executeUpdate();

            int id = -1;
            java.sql.ResultSet rs = pstmt.getGeneratedKeys();

            if (rs.next()) {
                id = rs.getInt(1);
                System.out.println(id);
            }
            rs.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public boolean deleteContact(Contacto contacto) {
        try {
            java.sql.PreparedStatement pstmt = DBManager.getInstance().getNuevaConexion().prepareStatement(
                    "DELETE FROM contactos WHERE id = ?");
            pstmt.setString(1, String.valueOf(contacto.getId()));
            pstmt.executeUpdate();
            pstmt.close();
            return true;
        } catch (Exception ex) {
            return false;
        }
    }

    public boolean updateContact(Contacto contacto) {
        String razonSocial;
        int movil;
        char tipo;
        String web = "null";
        String rubros = "null";
        java.sql.Date fecha;

        try {
            if (contacto.getTipo() == Contacto.ES_EMPRESA) {
                tipo = 'E';
                Empresa empresa = (Empresa) contacto;
                razonSocial = empresa.getRazonSocial();
                movil = 0;
                fecha = new java.sql.Date(Calendar.getInstance().getTime().getTime());
                web = empresa.getUrlWeb();
                rubros = empresa.getRubros();
            } else {
                tipo = 'P';
                Persona persona = (Persona) contacto;
                razonSocial = persona.getNombre();
                movil = persona.getCelular();
                fecha = new java.sql.Date(persona.getFechaNacimiento().getTime().getTime());
            }

            java.sql.PreparedStatement pstmt = DBManager.getInstance().getNuevaConexion().prepareStatement(
                    "UPDATE contactos set tipo=?,nombre_razon=?,direccion=?,cp=?,telefono=?"
                    + ",email=?,telefono_movil=?,fecha_nacimiento=?,web=?,rubros=?"
                    + "WHERE id =?");
            pstmt.setString(1, String.valueOf(tipo));
            pstmt.setString(2, razonSocial);
            pstmt.setString(3, contacto.getDireccion());
            pstmt.setString(4, String.valueOf(contacto.getCiudad().getCodigoPostal()));
            pstmt.setString(5, String.valueOf(contacto.getTelefono()));
            pstmt.setString(6, contacto.getCorreoElectronico());
            pstmt.setString(7, String.valueOf(movil));
            pstmt.setString(8, new SimpleDateFormat("yyyy-MM-dd").format(fecha));
            pstmt.setString(9, web);
            pstmt.setString(10, rubros);
            pstmt.setString(11, String.valueOf(contacto.getId()));
            pstmt.executeUpdate();
            pstmt.close();
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
